package com.zhoug.common.pagevalid;

import android.content.Context;
import android.content.Intent;


import com.zhoug.common.utils.LogUtils;

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.UUID;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.OnLifecycleEvent;


/**
 * 一个执行单元
 * 包括一个执行目标体和一个检验队列。检验队列用来保证所有的前置条件。当所有的前置条件都通过后，才能执行目标
 *
 * @Author 35574
 * @Date 2021/4/6
 * @Description
 */
public class CallUnit implements LifecycleObserver {
    private static final String TAG = ">>>CallUnit";
    public static final String CHAIN_ID = "chainId";
    private static final boolean DEBUG = false;
    /**
     * 目标行为
     */
    private Action action;
    /**
     * 先进先出验证模型
     */
    private Queue<Validator> validQueue = new ArrayDeque<>();

    /**
     * 唯一标志
     */
    private String chainId = UUID.randomUUID().toString();


    public CallUnit(LifecycleOwner owner) {
        if(owner!=null){
            owner.getLifecycle().addObserver(this);
        }
    }

    /**
     * 新建实例
     *
     * @param owner
     * @return
     */
    public static CallUnit newInstance(LifecycleOwner owner) {
        return new CallUnit(owner);
    }

    /**
     * 设置目标行为
     *
     * @param action
     * @return
     */
    public CallUnit setAction(Action action) {
        this.action = action;
        return this;
    }

    /**
     * 添加验证器
     *
     * @param pageValidator
     * @return
     */
    public CallUnit addValidator(Validator pageValidator) {
        validQueue.add(pageValidator);
        return this;
    }




    /**
     * 开始执行
     * @param context
     */
    public void start(Context context) {
        CallUnitManager.getInstance().postCallUnit(this);
        if (DEBUG) {
            LogUtils.d(TAG, "start:");
        }
        nextValid(context);
    }

    /**
     * 下一个验证
     * @param context
     */
    @SuppressWarnings("all")
    protected void nextValid(Context context) {
        if (check()) {
            invoke();
        } else {
            if (DEBUG) {
                LogUtils.d(TAG, "nextValid:下一个验证");
            }
            Validator lastValid = validQueue.peek();
            Intent intent = new Intent();
            intent.putExtra(CHAIN_ID, chainId);
            lastValid.doValidFailed(context,chainId, intent);
        }
    }

    /**
     * 检查PageValidator如果已经满足要求，则移出来队列
     */
    protected boolean check() {
        if (validQueue.size() == 0) {
            return true;
        }
        for (Validator valid : validQueue) {
            if (valid.valid()) {
                if (DEBUG) {
                    LogUtils.d(TAG, "success");
                }
                validQueue.remove(valid);
            }else{
                if (DEBUG) {
                    LogUtils.d(TAG, "false");
                }
            }
        }
        return validQueue.size() == 0;
    }

    /**
     * 全部验证通过后执行
     */
    private void invoke() {
        if (DEBUG) {
            LogUtils.d(TAG, "验证通过,开始执行操作");
        }
        action.call();
        CallUnitManager.getInstance().remove(chainId);
    }

    public String getChainId() {
        return chainId;
    }


    /**
     * 监听到页面销毁移除引用
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        if (DEBUG) {
            LogUtils.d(TAG, "onDestroy:监听到页面销毁,移除引用");
        }
        CallUnitManager.getInstance().remove(chainId);
    }


}
